#include <iostream>
using namespace std;

/*
    问题：
        1.继承之后，父类的指针指向子类的堆空间，delete 父类指针，不会调用子类的析构函数，析构的不彻底
    解决办法：
        将父类的析构函数声明为虚析构函数
        语法： virtual ~类名(){}
    底层原理：
        1.父类的析构定义成虚析构，编译器采用动态联编，看赋值运算的右边
        Animal *p = c1;
        delete p;   // 看右边   ==> 析构 先调用c1的析构，再调用p的析构
        2.父类的析构不是虚析构，编译器采用静态联编，看赋值运算的左边
        Animal *p = c1;
        delete p;   // 看左边   ==> 析构 只调用p的析构，不调用c1的析构
    
*/


class Animal
{
public:
    virtual ~Animal()
    {
        cout << "~Animal()" << endl;
    }
};
class Cat : public Animal
{
public:
    ~Cat()
    {
        cout << "~Cat()" << endl;
    }
};

int main()
{
    Cat *c1 = new Cat;

    Animal *p = c1;

    //  delete c1 和delete p 不等价
    // delete c1;  // 调用了父类和子类的析构
    delete p;   // 调用父类析构

    return 0;
}